/*
 * $Header: /root/kb/src/com/chinacti/commons/dao/BaseDao.java,v 1.7 2008/08/11 10:34:57 sgmc Exp $
 * $Revision: 1.7 $
 * $Date: 2008/08/11 10:34:57 $
 */
package com.easycoding.framework.dao.hibernate;

import java.io.Serializable;
import java.util.List;

/**
 * 
 * @author 王键昆
 * 通用dao方法接口,其他dao接口只需继承该接口
 *
 */
public interface IAbstractDao<T, PK extends Serializable> {
    
    /**
     * 添加一条记录
     * @param t 记录
     */
    public void insert (T t);

    /**
     * 删除一条记录
     * @param t
     */
    public void delete (T t);
    
    
    /**
     * 根据具体类和id删除一条记录
     * @param entityClass 类名
     */
    public void delete (PK pk);
    
    
    /**
     * 批量删除数据
     * @param entityClass 删除数据类型
     * @param pks 主键数组
     */
    public void deleteBatch(PK[] pks);
    
    
    /**
     * 批量删除持久对象
     * @param ts
     */
    public void deleteBatch(T[] ts);
    
    
    /**
     * 批量添加数据
     * @param ts 待添加对象数组
     */
    public void insertBatch(final T[] ts);


    /**
     * 更新一条记录
     * @param t
     */
    public void update (T t);
    
    /**
     * 根据id加载记录
     * @param id
     * @param entityClass 
     * @return 查找不到记录,抛出异常
     */
    public T load(PK id);
    
    /**
     * 根据id加载记录
     * @param id 主键
     * @param entityClass 
     * @return 查找不到记录,返回null
     */
    public T get(PK id); 
    
    /**
     * 加载所有的记录
     * @param entityClass 
     * @return 如果找不到记录,则返回size为0的list
     */
    public List<T> findAll();
    
    
    /**
     * 清空缓存
     * @param entityClass
     */
    public void evict(T t);
    
    
    /**
     * 清空二级缓存
     * @param t 
     * @param k
     */
    public void evictFromFactory(PK k);
    
    /**
     * 
     * 向数据库提交sql语句
     */
    public void flush();
    
    /**     
     * 清空缓存一级缓存数据
     */
	public void clear();
	
    /**
     * 由子类判断是保存还是更新
     * @param t 待保存的对象
     */
    public void saveOrUpdate(T t);
    
}
